package com.ucode.cgms.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ucode.cgms.mapper.CgmsCompanionOrderMapper;
import com.ucode.model.cgms.CgmsCompanionOrder;
import com.ucode.model.cgms.CgmsJointServiceUser;
import com.ucode.model.cgms.enums.CgmsSysResultCodeEnum;
import com.ucode.springboot.starter.mybatis.core.base.BaseService;
import com.ucode.tool.base.enums.GlobalResultCodeEnum;
import com.ucode.tool.exception.UcodeServiceException;
import com.ucode.tool.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 陪玩订单Service
 * @Author: liliang
 * @Date: 2025/5/11 13:50
 * @Version: 1.0
 */
public interface CgmsCompanionOrderService extends BaseService<Long, CgmsCompanionOrder, CgmsCompanionOrderMapper> {

    /**
     * 支付成功回调
     * @param orderId
     * @param payOrderId
     * @param payType
     * @param payTime
     * @param payAmount
     */
    public void paySuccess(Long orderId, Long payOrderId, String payType, LocalDateTime payTime, Integer payAmount);

    /**
     * 【系统】取消订单
     * @param id
     */
    public void cancel(Long id);

    /**
     * 【会员】取消订单
     * @param userId
     * @param id
     */
    public void cancelByMember(Long userId, Long id);
    /**
     * 【会员】确认完工
     * @param userId
     * @param id
     */
    public void confirmCompleted(Long userId, Long id);
    /**
     * 【系统】确认接单
     * @param id
     */
    public void confirmReceive(Long id);

    /**
     * 【会员】确认接单
     * @param userId
     * @param id
     */
    public void confirmReceiveByMember(Long userId, Long id);

    /**
     * 管理员代替陪玩拒绝接单，拒绝接单后，订单状态为拒绝
     * @param id
     */
    public void refuseReceiveByAdmin(Long id);
    /**
     * 陪玩拒绝接单，拒绝接单后，订单状态为派单中
     * @param userId 接单用户ID
     * @param id
     */
    public void refuseReceiveByMember(Long userId, Long id);

    /**
     * 添加联合报备人（注意必须是同一个订单）
     * @param userId 接单人
     * @param orderId 订单ID
     * @param jointServiceUsers 联合报备人
     */
    public void addJointServiceUser(Long userId,Long orderId, List<CgmsJointServiceUser> jointServiceUsers);

    /**
     * 删除联合报备人
     * @param userId 接单人
     * @param orderId 订单ID
     * @param jointServiceUserId 联合报备人ID
     */
    public void deleteJointServiceUser(Long userId,Long orderId,Long jointServiceUserId);
    /**
     * 完工报备
     * @param reportUserId
     * @param id
     * @param serviceStartTime
     * @param serviceEndTime
     * @param evidencePics
     * @param evidenceRemark
     */
    public void companionReport(Long reportUserId, Long id,LocalDateTime serviceStartTime,LocalDateTime serviceEndTime,List<String> evidencePics,String evidenceRemark);

    /**
     * 【管理员】订单备注
     * @param id
     * @param remark
     */
    public int updateRemark(Long id,String remark);

    /**
     * 【会员】修改订单备注
     * @param id
     * @param remark
     */
    public void updateRemarkByMember(Long userId,Long id,String remark);

    /**
     * 【会员】删除订单
     * @param userId
     * @param id
     */
    public int deleteByMember(Long userId, Long id);

    /**
     * 派单
     * @param orderId
     */
    public void designateOrder(Long userId, Long orderId);

    /**
     * 抢单
     * @param orderId
     */
    public void snatchOrder(Long userId, Long orderId);
    /**
     * 待抢订单列表
     * @return
     */
    public List<CgmsCompanionOrder> queryCompanionUserSnatchOrderList();
    /**
     * 校验
     * @param id
     * @return
     */
    public default CgmsCompanionOrder validate(Long id){
        if(ObjectUtil.isNull(id) )
            throw new UcodeServiceException(GlobalResultCodeEnum.VALIDATE_FAILED);
        //验证数据是否存在
        CgmsCompanionOrder bean = this.selectByPrimaryKey(id);
        if(ObjectUtil.isNull(bean) || bean.getDeltag()){
            throw new UcodeServiceException(CgmsSysResultCodeEnum.COMPANION_ORDER_NOT_EXISTS);
        }
        return bean;
    }

    /**
     * 校验
     * @param id
     * @return
     */
    public default CgmsCompanionOrder validate(Long id,Long userId){
        CgmsCompanionOrder bean = this.validate(id);

        if(!ObjUtil.equals(bean.getMemberId(),userId)){
            throw new UcodeServiceException(GlobalResultCodeEnum.UN_DATA_PERMISSION);
        }
        return bean;
    }

    default Map<Long, CgmsCompanionOrder> getMap(Collection<Long> ids) {
        return CollUtil.isEmpty(ids) ? new HashMap() : CollectionUtils.convertMap(this.selectByPrimaryKeys(ids), CgmsCompanionOrder::getId);
    }

    /**
     * 审核陪玩报备
     * @param id 订单ID
     * @param auditState 审核状态
     * @param processorId 处理人ID
     * @param processorType 处理人类型
     * @param processRemark 处理备注
     * @return 更新结果
     */
    boolean auditReport(Long id, Integer auditState, Long processorId, Integer processorType, String processRemark);

}
